//
//  NSDecimalNumber+MZBase.h
//  MZBaseDemo
//
//  Created by Chris Yang on 2016/12/5.
//  Copyright © 2016年 Chris Yang. All rights reserved.
//

#import <Foundation/Foundation.h>

/* Compare */
#define mzDecimalMin(num1, num2)    (([num1 doubleValue] < [num2 doubleValue]) ? num1 : num2)
#define mzDecimalMax(num1, num2)    (([num1 doubleValue] > [num2 doubleValue]) ? num1 : num2)

/* 完整性支持 (初始值/nan值判定/有效值判定/有效值转化)*/
#define mzDecimalInitVal                [NSDecimalNumber decimalNumberWithString:@"0"]
#define mzDecimalIsNaN(decimalNum)      isnan(decimalNum.doubleValue)
#define mzDecimalIsValid(decimalNum)    (((nil == decimalNum) || mzDecimalIsNaN(decimalNum)) ? NO : YES)
#define mzDecimalValidVal(decimalNum)   ((YES == mzDecimalIsValid(decimalNum)) ? decimalNum : mzDecimalInitVal)

@interface NSDecimalNumber(MZBase)

/*
 * 1. 简化DecimalNumber的操作接口
 * 2. 针对操作值进行异常默认处理
 *  2.1 运算符左值错误：不进行操作，直接返回默认值（0）
 *  2.2 运算符右值错误：不进行操作，直接返回左值
 *  2.3 运算符右值(除数0)：不进行操作，直接返回左值
 * 3. self值不进行改变，需要通过赋值改变
 */
- (NSDecimalNumber *)mzAdd:(NSDecimalNumber *)inputNum;
- (NSDecimalNumber *)mzSub:(NSDecimalNumber *)inputNum;
- (NSDecimalNumber *)mzMul:(NSDecimalNumber *)inputNum;
- (NSDecimalNumber *)mzDiv:(NSDecimalNumber *)inputNum;

/* Decimal(self)与String的快捷安全运算 */
- (NSDecimalNumber *)mzAddStr:(NSString *)inputStr;
- (NSDecimalNumber *)mzSubStr:(NSString *)inputStr;
- (NSDecimalNumber *)mzMulStr:(NSString *)inputStr;
- (NSDecimalNumber *)mzDivStr:(NSString *)inputStr;

/* Decimal(self)与NSNumber的快捷安全运算 */
- (NSDecimalNumber *)mzAddNum:(NSNumber *)inputNum;
- (NSDecimalNumber *)mzSubNum:(NSNumber *)inputNum;
- (NSDecimalNumber *)mzMulNum:(NSNumber *)inputNum;
- (NSDecimalNumber *)mzDivNum:(NSNumber *)inputNum;

/** 精度保留
 * 1. 保留输入的小数位数的精度(非规格化)
 */
- (NSDecimalNumber *)mzRoundingValWithScale:(NSInteger)scale;

/* DecimalNumber的安全转化：
 * 1. 保证输出值为可操作的值
 */
+ (NSDecimalNumber *)mzDecimalNumberFromNSString:(NSString *)str;
+ (NSDecimalNumber *)mzDecimalNumberFromNumber:(NSNumber *)num;

@end
